class MapUtils {
    // WGS84 转 GCJ02
    static wgs84ToGcj02(lng, lat) {
        if (this.outOfChina(lng, lat)) {
            return [lng, lat];
        }

        let dlat = this.transformLat(lng - 105.0, lat - 35.0);
        let dlng = this.transformLng(lng - 105.0, lat - 35.0);
        
        const radlat = lat / 180.0 * Math.PI;
        let magic = Math.sin(radlat);
        magic = 1 - 0.00669342162296594323 * magic * magic;
        const sqrtmagic = Math.sqrt(magic);
        
        dlat = (dlat * 180.0) / ((6378245.0 * (1 - 0.00669342162296594323)) / (magic * sqrtmagic) * Math.PI);
        dlng = (dlng * 180.0) / (6378245.0 / sqrtmagic * Math.cos(radlat) * Math.PI);
        
        const mglat = lat + dlat;
        const mglng = lng + dlng;
        
        return [mglng, mglat];
    }

    // GCJ02 转 WGS84
    static gcj02ToWgs84(lng, lat) {
        if (this.outOfChina(lng, lat)) {
            return [lng, lat];
        }
        
        let [mglng, mglat] = this.wgs84ToGcj02(lng, lat);
        const dlng = mglng - lng;
        const dlat = mglat - lat;
        return [lng - dlng, lat - dlat];
    }

    // 判断是否在中国境内
    static outOfChina(lng, lat) {
        if (lng < 72.004 || lng > 137.8347) {
            return true;
        }
        if (lat < 0.8293 || lat > 55.8271) {
            return true;
        }
        return false;
    }

    // 转换经度
    static transformLng(lng, lat) {
        let ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
        ret += (20.0 * Math.sin(6.0 * lng * Math.PI) + 20.0 * Math.sin(2.0 * lng * Math.PI)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(lng * Math.PI) + 40.0 * Math.sin(lng / 3.0 * Math.PI)) * 2.0 / 3.0;
        ret += (150.0 * Math.sin(lng / 12.0 * Math.PI) + 300.0 * Math.sin(lng / 30.0 * Math.PI)) * 2.0 / 3.0;
        return ret;
    }

    // 转换纬度
    static transformLat(lng, lat) {
        let ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
        ret += (20.0 * Math.sin(6.0 * lng * Math.PI) + 20.0 * Math.sin(2.0 * lng * Math.PI)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(lat * Math.PI) + 40.0 * Math.sin(lat / 3.0 * Math.PI)) * 2.0 / 3.0;
        ret += (160.0 * Math.sin(lat / 12.0 * Math.PI) + 320 * Math.sin(lat * Math.PI / 30.0)) * 2.0 / 3.0;
        return ret;
    }

    // 计算两点之间的距离（米）
    static calculateDistance(point1, point2) {
        const R = 6371000; // 地球半径（米）
        const [lng1, lat1] = point1;
        const [lng2, lat2] = point2;
        
        const dLat = this.toRad(lat2 - lat1);
        const dLng = this.toRad(lng2 - lng1);
        const a = Math.sin(dLat/2) * Math.sin(dLat/2) +
                Math.cos(this.toRad(lat1)) * Math.cos(this.toRad(lat2)) * 
                Math.sin(dLng/2) * Math.sin(dLng/2);
        const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        return R * c;
    }

    // 计算多边形面积（平方米）
    static calculateArea(points) {
        const pointCount = points.length;
        if (pointCount < 3) return 0;

        let area = 0;
        const R = 6371000; // 地球半径（米）

        for (let i = 0; i < pointCount; i++) {
            const j = (i + 1) % pointCount;
            const [lng1, lat1] = points[i];
            const [lng2, lat2] = points[j];
            
            const dLng = this.toRad(lng2 - lng1);
            const sinLat1 = Math.sin(this.toRad(lat1));
            const sinLat2 = Math.sin(this.toRad(lat2));
            
            area += dLng * (2 + sinLat1 + sinLat2);
        }
        
        area = area * R * R / 2.0;
        return Math.abs(area);
    }

    // 角度转弧度
    static toRad(degree) {
        return degree * Math.PI / 180;
    }

    // 格式化距离显示
    static formatDistance(meters) {
        if (meters < 1000) {
            return `${Math.round(meters)}米`;
        } else {
            return `${(meters/1000).toFixed(2)}公里`;
        }
    }

    // 格式化面积显示
    static formatArea(squareMeters) {
        if (squareMeters < 10000) {
            return `${Math.round(squareMeters)}平方米`;
        } else {
            return `${(squareMeters/10000).toFixed(2)}公顷`;
        }
    }
}

// 导出
window.MapUtils = MapUtils; 